package com.pos.app.util.db;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import android.annotation.SuppressLint;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

import com.pos.app.util.db.MySQLiteDatabase.TADBUpdateListener;

/**
 * @Description 管理数据库的创建和版本更新
 */
public class DBHelper extends SQLiteOpenHelper
{
	/**
	 * 数据库更新监听器
	 */
	private TADBUpdateListener mTadbUpdateListener;

	/**
	 * 构造函数
	 * 
	 * @param context
	 *            上下文
	 * @param name
	 *            数据库名字
	 * @param factory
	 *            可选的数据库游标工厂类，当查询(query)被提交时，该对象会被调用来实例化一个游标
	 * @param version
	 *            数据库版本
	 */
	public DBHelper(Context context, String name, CursorFactory factory, int version)
	{
		super(context, name, factory, version);
		// TODO Auto-generated constructor stub
		copyDatabaseFile(context, name,version);
	}

	/**
	 * 构造函数
	 * 
	 * @param context
	 *            上下文
	 * @param name
	 *            数据库名字
	 * @param factory
	 *            可选的数据库游标工厂类，当查询(query)被提交时，该对象会被调用来实例化一个游标
	 * @param version
	 *            数据库版本
	 * @param tadbUpdateListener
	 *            数据库更新监听器
	 */
	public DBHelper(Context context, String name, CursorFactory factory, int version, TADBUpdateListener tadbUpdateListener)
	{
		super(context, name, factory, version);
		// TODO Auto-generated constructor stub
		this.mTadbUpdateListener = tadbUpdateListener;
	}

	/**
	 * 设置数据库更新监听器
	 * 
	 * @param mTadbUpdateListener
	 *            数据库更新监听器
	 */
	public void setOndbUpdateListener(TADBUpdateListener tadbUpdateListener)
	{
		this.mTadbUpdateListener = tadbUpdateListener;
	}

	public void onCreate(SQLiteDatabase db)
	{

	}

	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
	{
		if (mTadbUpdateListener != null)
		{
			mTadbUpdateListener.onUpgrade(db, oldVersion, newVersion);
		}
	}

	/**
	 * 将数据库文件从asset 文件夹拷贝到数据库存放目录
	 * 
	 * @param context
	 * @date 2013-10-28 上午9:51:59
	 */
	public static void copyDatabaseFile(Context context, String dbName,int newVersion)
	{
		String databaseFileName = getDatabasesPath(context) + dbName;
		File dir = new File(getDatabasesPath(context));
		// 判断文件夹是否存在，不存在就新建一个
		if (!dir.exists())
		{
			dir.mkdir();
		}
		// 检测是否已经创建
		dir = new File(databaseFileName);
		if (!dir.exists())
		{
			FileOutputStream os = null;
			InputStream is = null;
			try
			{
				// TODO: 2014-4-18在这里影响程序缓慢
				dir.createNewFile();
				// 得到数据库文件的写入流
				os = new FileOutputStream(databaseFileName);
				// 得到assets的输出流
				is = context.getResources().getAssets().open(dbName);
				byte[] buffer = new byte[8192];
				int count = 0;
				while ((count = is.read(buffer)) > 0)
				{
					os.write(buffer, 0, count);
					os.flush();
				}
			}
			catch (Exception e)
			{
				e.printStackTrace();
			}
			finally
			{
				try
				{
					is.close();
					os.close();
				}
				catch (IOException e)
				{
					e.printStackTrace();
				}
			}
		}
		else
		{
			if(checkVersion(databaseFileName, newVersion)){
				if(dir.delete()){
					copyDatabaseFile(context, dbName, newVersion);					
				}
			}
		}
	}

	@SuppressLint("SdCardPath")
	public static String getDatabasesPath(Context context)
	{
		return "/data/data/" + context.getPackageName() + "/databases/";
	}
	
	/**
	 * 检查数据库
	 * @param context
	 * @param dbName
	 * @param newVersion
	 * @return
	 */
	public static boolean checkVersion(String databaseFilename,int newVersion){
		SQLiteDatabase checkDB = null;
		checkDB = SQLiteDatabase.openDatabase(databaseFilename, null, SQLiteDatabase.OPEN_READONLY);
		boolean bool = false;
		if(newVersion > checkDB.getVersion()){
			bool = true;
		}else{
			bool = false;
		}
		if (checkDB != null)
		{
			checkDB.close();//关闭数据库
		}
		return bool;
	}

}
